package ym.ecrm.core.service.systemManagement;

import java.io.Serializable;
import java.util.List;

import ym.ecrm.core.common.exception.MessageException;
import ym.ecrm.core.common.util.Node;
import ym.ecrm.core.common.util.Pager;
import ym.ecrm.core.domain.systemManagement.Role;
import ym.ecrm.core.domain.systemManagement.User;
import ym.ecrm.core.dto.systemManagement.OrganizationDTO;
import ym.ecrm.core.dto.systemManagement.ResourceDTO;
import ym.ecrm.core.dto.systemManagement.RoleDTO;
import ym.ecrm.core.dto.systemManagement.RoleQueryConditionDTO;
import ym.ecrm.core.dto.systemManagement.UserDTO;
import ym.ecrm.core.dto.systemManagement.UserQueryConditionDTO;


public interface ISystemService {
	
	/**
	 * 登陆
	 * @param userName 用户名
	 * @param password 密码
	 * @return UserDTO
	 * @throws MessageException 用户名不存在或密码不正确时抛出该异常
	 *                          MessageException中包含错误信息
	 */
	public UserDTO login(String userName, String password) throws MessageException;
	
	/**
	 * 更新用户信息
	 * @param userDTO dto传输对象
	 * @return 
	 * @throws MessageException 
	 */
	public boolean modifyUser(UserDTO userDTO) throws MessageException;
	/**
	 * 创建新的用户
	 * @param userDTO
	 * @return
	 * @throws MessageException 用户名或用户编号重复时，抛出该异常
	 * 							MessageException中包含错误信息	
	 */
	public UserDTO createUser(UserDTO userDTO) throws MessageException;
	/**
	 * 修改角色
	 * @param userId 用户Id
	 * @param roles roles为List<Long>类型，值为角色的Id集合
	 * @return
	 * @throws MessageException 移除内置角色时，抛出该异常
	 *                          MessageException中包含错误信息
	 */
	boolean changeRole(Serializable userId, List<Long> roles) throws MessageException;
	/**
	 * 新曾角色
	 * @param roleDTO
	 * @return
	 * @throws MessageException 角色编号和角色名称重复时，抛出该异常
	 *                          MessageException中包含错误信息
	 */ 
	boolean createRole(RoleDTO roleDTO) throws MessageException;
	
	/**
	 * 分页查询所有角色
	 * @param pageNumber 第几页
	 * @param pageSize 每页显示的条数
	 * @return Pager<Role> 返回分页辅助类Pager，
	 * 					可以通过Pager.getData()得到查询返回结果集list<Role>
	 */
	public Pager<RoleDTO> findRoles(int pageNumber, int pageSize);
	
	/**
	 * 查询符合条件的Role
	 * @param queryConditionDTO 查询辅助，包括：roleCode角色编号
	 *        roleName角色名称，buildIn是否内置
	 * @return List<RoleDTO> 返回符合条件的List<Role>
	 */
	public List<RoleDTO> findRoles(RoleQueryConditionDTO queryConditionDTO);
	
	/**
	 * 条件分页查询
	 * @param queryConditionDTO 查询辅助，包括：roleCode角色编号
	 *        roleName角色名称，buildIn是否内置
	 * @param pageNumber 第几页
	 * @param pageSize 每页显示的条数
	 * @return Pager<RoleDTO> 分页类，包括pageNumber，pageSize，totalCount
	 * 					可以通过getDate()方法等到查询到的结果集的List<Role>
	 */
	public Pager<RoleDTO> findRoles(RoleQueryConditionDTO queryConditionDTO
			, int pageNumber, int pageSize);
	
	/**
	 * 通过Id删除用户
	 * @param id 用户Id
	 */
	public void deleteUser(Serializable id);
	
	/**
	 * 删除用户集合
	 * @param idList 须要用户的Id集合
	 */
	void deleteUsers(List<Long> idList);
	
	/**
	 * 条件分页查询用户
	 * @param queryConditionDTO 条件
	 * @param pageNumber 第几页
	 * @param pageSize 每页显示的条数
	 * @return Pager<UserDTO> 分页辅助类，
	 * 					        包括pageNumber,pageSize,totalCount,date
	 */
	Pager<UserDTO> findUsers(UserQueryConditionDTO queryConditionDTO,
			int pageNumber, int pageSize);
	/**
	 * 通过Id来load用户 
	 * @param userId 
	 * @return
	 */
	UserDTO loadUser(Serializable userId);
	
	/**
	 * 分页查询用户
	 * @param pageNumber 第几页
	 * @param pageSize 每页显示的条数
	 * @return Pager<User> 分页辅助类，
	 * 					        包括pageNumber,pageSize,totalCount,date
	 */
	Pager<UserDTO> findUsers(int pageNumber, int pageSize);
	/**
	 * 多条件查询
	 * @param queryConditionDTO 查询条件
	 * @return List<User>
	 */
	List<UserDTO> findUsers(UserQueryConditionDTO queryConditionDTO);
	/**
	 * 通过Id来load组织结构 
	 * @param organizationId
	 * @return
	 */
	OrganizationDTO loadOrganization(Serializable organizationId);
	
	/**
	 * 创建用户组织结构
	 * @param organizationDTO 保存用户组织结构信息的对象
	 * @return
	 * @throws MessageException 
	 */
	boolean createOrganization(OrganizationDTO organizationDTO) throws MessageException;
	
	/**
	 * 根据Id来删除用户组织结构
	 * @param id 要删除的组织结构的Id
	 * @return
	 */
	boolean deleteOrganization(Serializable id);
	
	/**
	 * 为用户分配角色
	 * @param userId
	 * @param roleId
	 * @return
	 */
	boolean distributeRoles(Serializable userId, List<Serializable> roleId);
	
	/**
	 * 修改用户密码
	 * @param password
	 * @return
	 */
	boolean changePassword(Long userId, String password);
	
	/**
	 * 重置密码为默认密码
	 */
	boolean changePasswordDefault(Long userId);
	boolean modifyRole(RoleDTO roleDTO) throws MessageException;
	boolean deleteRole(Serializable id);
	public void modifyOrganization(OrganizationDTO organizationDTO) throws MessageException;

	public void createResource(ResourceDTO resourceDTO);

	public void deleteResource(long resourceId);

	public void modifyResource(ResourceDTO resourceDTO);

	Node findOrganizationReturnTree();

	Pager<UserDTO> findUsersByOrganizationId(long organization, int page,
			int limit);

	public Pager<OrganizationDTO> findOrganizations(int i, int j);
}
